package com.berchen.方法引用与构造器引用;

import com.berchen.Lambda表达式.Employee;
import org.junit.Test;

import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 构造器引用：
 * 格式：
 * 类::new
 * <p>
 * 构造器的参数列表，与接口中的方法的参数列表一致。
 * 接口中的方法没有参数：默认就是调用无参构造。
 * 接口中的方法有参数：默认根据参数的多少和类型来调用构造器。
 */
public class TestConstructor {

    @Test
    public void test1() {

        Supplier<Employee> sup = () -> new Employee();
        Supplier<Employee> sup1 = Employee::new;  // 构造器引用
        Employee employee = sup1.get();
        System.out.println(employee);
    }

    @Test
    public void test2() {

        Function<String, Employee> run = x -> new Employee(x);
        Function<String, Employee> run1 = Employee::new;   // 调用一个参数的构造器，参数类型是Integer。apply方法的参数是一个并且是integer
        Employee chen = run1.apply("chen");
        System.out.println(chen);
    }

    @Test
    public void test3() {

        BiFunction<Integer, Double, Employee> bf = (x, y) -> new Employee(x, y);
        BiFunction<Integer, Double, Employee> bf1 = Employee::new;  // 调用的是两个参数的构造器，参数的类型是Integer和Double。
        Employee apply = bf1.apply(10, 19.3);
        System.out.println(apply);
    }
}
